分类
联系方式
  1. 新浪微博
  2. E-mail

Racket 循环

for 循环

(for ([i '(1 2 3)])
     (display i))

for/list 和 for*/list

感觉有点像 Python 下的 zip,同时遍历多个 list。有两种版本:

for/list:

> (for/list ([i '(1 2 3 4)]
             [name '("goodbye" "farewell" "so long")])
    (format "~a: ~a" i name))
'("1: goodbye" "2: farewell" "3: so long"

for*/list:

> (for*/list ([i '(1 2 3 4)]
             [name '("goodbye" "farewell" "so long")])
    (format "~a: ~a" i name))
'("1: goodbye"
  "1: farewell"
  "1: so long"
  "2: goodbye"
  "2: farewell"
  "2: so long"
  "3: goodbye"
  "3: farewell"
  "3: so long"
  "4: goodbye"
  "4: farewell"
  "4: so long")

for*/list 版本吧所有组合给穷举了。

多列表运算

for/product、for/sum:

> (for/product ([i '(1 2 3)]
                [j '(4 5 6)])
    (* i j))
720
> (for/sum ([i '(1 2 3)]
            [j '(4 5 6)])
    (* i j))
32

元素取值

for/first、for/last:

> (for/last ([i '(1 2 3)]
             [j '(4 5 6)])
    (* i j))
18

多列表转字典

for/hash:

> (for/hash ([i '(1 2 3)]
             [j '(4 5 6)])
    (values i j))
'#hash((1 . 4) (2 . 5) (3 . 6))

while(True) 等效实现

使用 in-naturals 生成无限序列:

> (for ([i (in-naturals)])
    (if (= i 10)
        (error "too much!")
        (display i)))
123456789
too much!